// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Code generated by sidekick. DO NOT EDIT.

#![allow(rustdoc::redundant_explicit_links)]
#![allow(rustdoc::broken_intra_doc_links)]
#![no_implicit_prelude]
extern crate bytes;
extern crate serde;
extern crate serde_json;
extern crate serde_with;
extern crate std;
extern crate wkt;

mod debug;
mod deserialize;
mod serialize;

/// The widget subset used by an add-on.
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct AddOnWidgetSet {
    /// The list of widgets used in an add-on.
    pub used_widgets: std::vec::Vec<crate::model::add_on_widget_set::WidgetType>,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl AddOnWidgetSet {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [used_widgets][crate::model::AddOnWidgetSet::used_widgets].
    pub fn set_used_widgets<T, V>(mut self, v: T) -> Self
    where
        T: std::iter::IntoIterator<Item = V>,
        V: std::convert::Into<crate::model::add_on_widget_set::WidgetType>,
    {
        use std::iter::Iterator;
        self.used_widgets = v.into_iter().map(|i| i.into()).collect();
        self
    }
}

impl wkt::message::Message for AddOnWidgetSet {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.AddOnWidgetSet"
    }
}

/// Defines additional types related to [AddOnWidgetSet].
pub mod add_on_widget_set {
    #[allow(unused_imports)]
    use super::*;

    /// The Widget type. DEFAULT is the basic widget set.
    ///
    /// # Working with unknown values
    ///
    /// This enum is defined as `#[non_exhaustive]` because Google Cloud may add
    /// additional enum variants at any time. Adding new variants is not considered
    /// a breaking change. Applications should write their code in anticipation of:
    ///
    /// - New values appearing in future releases of the client library, **and**
    /// - New values received dynamically, without application changes.
    ///
    /// Please consult the [Working with enums] section in the user guide for some
    /// guidelines.
    ///
    /// [Working with enums]: https://google-cloud-rust.github.io/working_with_enums.html
    #[derive(Clone, Debug, PartialEq)]
    #[non_exhaustive]
    pub enum WidgetType {
        /// The default widget set.
        Unspecified,
        /// The date picker.
        DatePicker,
        /// Styled buttons include filled buttons and disabled buttons.
        StyledButtons,
        /// Persistent forms allow persisting form values during actions.
        PersistentForms,
        /// Fixed footer in card.
        FixedFooter,
        /// Update the subject and recipients of a draft.
        UpdateSubjectAndRecipients,
        /// The grid widget.
        GridWidget,
        /// A Gmail add-on action that applies to the addon compose UI.
        AddonComposeUiAction,
        /// If set, the enum was initialized with an unknown value.
        ///
        /// Applications can examine the value using [WidgetType::value] or
        /// [WidgetType::name].
        UnknownValue(widget_type::UnknownValue),
    }

    #[doc(hidden)]
    pub mod widget_type {
        #[allow(unused_imports)]
        use super::*;
        #[derive(Clone, Debug, PartialEq)]
        pub struct UnknownValue(pub(crate) wkt::internal::UnknownEnumValue);
    }

    impl WidgetType {
        /// Gets the enum value.
        ///
        /// Returns `None` if the enum contains an unknown value deserialized from
        /// the string representation of enums.
        pub fn value(&self) -> std::option::Option<i32> {
            match self {
                Self::Unspecified => std::option::Option::Some(0),
                Self::DatePicker => std::option::Option::Some(1),
                Self::StyledButtons => std::option::Option::Some(2),
                Self::PersistentForms => std::option::Option::Some(3),
                Self::FixedFooter => std::option::Option::Some(4),
                Self::UpdateSubjectAndRecipients => std::option::Option::Some(5),
                Self::GridWidget => std::option::Option::Some(6),
                Self::AddonComposeUiAction => std::option::Option::Some(7),
                Self::UnknownValue(u) => u.0.value(),
            }
        }

        /// Gets the enum value as a string.
        ///
        /// Returns `None` if the enum contains an unknown value deserialized from
        /// the integer representation of enums.
        pub fn name(&self) -> std::option::Option<&str> {
            match self {
                Self::Unspecified => std::option::Option::Some("WIDGET_TYPE_UNSPECIFIED"),
                Self::DatePicker => std::option::Option::Some("DATE_PICKER"),
                Self::StyledButtons => std::option::Option::Some("STYLED_BUTTONS"),
                Self::PersistentForms => std::option::Option::Some("PERSISTENT_FORMS"),
                Self::FixedFooter => std::option::Option::Some("FIXED_FOOTER"),
                Self::UpdateSubjectAndRecipients => {
                    std::option::Option::Some("UPDATE_SUBJECT_AND_RECIPIENTS")
                }
                Self::GridWidget => std::option::Option::Some("GRID_WIDGET"),
                Self::AddonComposeUiAction => std::option::Option::Some("ADDON_COMPOSE_UI_ACTION"),
                Self::UnknownValue(u) => u.0.name(),
            }
        }
    }

    impl std::default::Default for WidgetType {
        fn default() -> Self {
            use std::convert::From;
            Self::from(0)
        }
    }

    impl std::fmt::Display for WidgetType {
        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
            wkt::internal::display_enum(f, self.name(), self.value())
        }
    }

    impl std::convert::From<i32> for WidgetType {
        fn from(value: i32) -> Self {
            match value {
                0 => Self::Unspecified,
                1 => Self::DatePicker,
                2 => Self::StyledButtons,
                3 => Self::PersistentForms,
                4 => Self::FixedFooter,
                5 => Self::UpdateSubjectAndRecipients,
                6 => Self::GridWidget,
                7 => Self::AddonComposeUiAction,
                _ => Self::UnknownValue(widget_type::UnknownValue(
                    wkt::internal::UnknownEnumValue::Integer(value),
                )),
            }
        }
    }

    impl std::convert::From<&str> for WidgetType {
        fn from(value: &str) -> Self {
            use std::string::ToString;
            match value {
                "WIDGET_TYPE_UNSPECIFIED" => Self::Unspecified,
                "DATE_PICKER" => Self::DatePicker,
                "STYLED_BUTTONS" => Self::StyledButtons,
                "PERSISTENT_FORMS" => Self::PersistentForms,
                "FIXED_FOOTER" => Self::FixedFooter,
                "UPDATE_SUBJECT_AND_RECIPIENTS" => Self::UpdateSubjectAndRecipients,
                "GRID_WIDGET" => Self::GridWidget,
                "ADDON_COMPOSE_UI_ACTION" => Self::AddonComposeUiAction,
                _ => Self::UnknownValue(widget_type::UnknownValue(
                    wkt::internal::UnknownEnumValue::String(value.to_string()),
                )),
            }
        }
    }

    impl serde::ser::Serialize for WidgetType {
        fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
        where
            S: serde::Serializer,
        {
            match self {
                Self::Unspecified => serializer.serialize_i32(0),
                Self::DatePicker => serializer.serialize_i32(1),
                Self::StyledButtons => serializer.serialize_i32(2),
                Self::PersistentForms => serializer.serialize_i32(3),
                Self::FixedFooter => serializer.serialize_i32(4),
                Self::UpdateSubjectAndRecipients => serializer.serialize_i32(5),
                Self::GridWidget => serializer.serialize_i32(6),
                Self::AddonComposeUiAction => serializer.serialize_i32(7),
                Self::UnknownValue(u) => u.0.serialize(serializer),
            }
        }
    }

    impl<'de> serde::de::Deserialize<'de> for WidgetType {
        fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
        where
            D: serde::Deserializer<'de>,
        {
            deserializer.deserialize_any(wkt::internal::EnumVisitor::<WidgetType>::new(
                ".google.apps.script.type.AddOnWidgetSet.WidgetType",
            ))
        }
    }
}

/// Common format for declaring a  menu item, or button, that appears within a
/// host app.
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct MenuItemExtensionPoint {
    /// Required. The endpoint to execute when this extension point is
    /// activated.
    pub run_function: std::string::String,

    /// Required. User-visible text describing the action taken by activating this
    /// extension point. For example, "Insert invoice".
    pub label: std::string::String,

    /// The URL for the logo image shown in the add-on toolbar.
    ///
    /// If not set, defaults to the add-on's primary logo URL.
    pub logo_url: std::string::String,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl MenuItemExtensionPoint {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [run_function][crate::model::MenuItemExtensionPoint::run_function].
    pub fn set_run_function<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.run_function = v.into();
        self
    }

    /// Sets the value of [label][crate::model::MenuItemExtensionPoint::label].
    pub fn set_label<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.label = v.into();
        self
    }

    /// Sets the value of [logo_url][crate::model::MenuItemExtensionPoint::logo_url].
    pub fn set_logo_url<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.logo_url = v.into();
        self
    }
}

impl wkt::message::Message for MenuItemExtensionPoint {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.MenuItemExtensionPoint"
    }
}

/// Common format for declaring an add-on's home-page view.
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct HomepageExtensionPoint {
    /// Required. The endpoint to execute when this extension point is
    /// activated.
    pub run_function: std::string::String,

    /// Optional. If set to `false`, disable the home-page view in this context.
    ///
    /// Defaults to `true` if unset.
    ///
    /// If an add-ons custom home-page view is disabled, an autogenerated overview
    /// card will be provided for users instead.
    pub enabled: std::option::Option<wkt::BoolValue>,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl HomepageExtensionPoint {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [run_function][crate::model::HomepageExtensionPoint::run_function].
    pub fn set_run_function<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.run_function = v.into();
        self
    }

    /// Sets the value of [enabled][crate::model::HomepageExtensionPoint::enabled].
    pub fn set_enabled<T>(mut self, v: T) -> Self
    where
        T: std::convert::Into<wkt::BoolValue>,
    {
        self.enabled = std::option::Option::Some(v.into());
        self
    }

    /// Sets or clears the value of [enabled][crate::model::HomepageExtensionPoint::enabled].
    pub fn set_or_clear_enabled<T>(mut self, v: std::option::Option<T>) -> Self
    where
        T: std::convert::Into<wkt::BoolValue>,
    {
        self.enabled = v.map(|x| x.into());
        self
    }
}

impl wkt::message::Message for HomepageExtensionPoint {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.HomepageExtensionPoint"
    }
}

/// Format for declaring a universal action menu item extension point.
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct UniversalActionExtensionPoint {
    /// Required. User-visible text describing the action taken by activating this
    /// extension point, for example, "Add a new contact".
    pub label: std::string::String,

    /// Required. The action type supported on a universal action menu item. It
    /// could be either a link to open or an endpoint to execute.
    pub action_type:
        std::option::Option<crate::model::universal_action_extension_point::ActionType>,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl UniversalActionExtensionPoint {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [label][crate::model::UniversalActionExtensionPoint::label].
    pub fn set_label<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.label = v.into();
        self
    }

    /// Sets the value of [action_type][crate::model::UniversalActionExtensionPoint::action_type].
    ///
    /// Note that all the setters affecting `action_type` are mutually
    /// exclusive.
    pub fn set_action_type<
        T: std::convert::Into<
                std::option::Option<crate::model::universal_action_extension_point::ActionType>,
            >,
    >(
        mut self,
        v: T,
    ) -> Self {
        self.action_type = v.into();
        self
    }

    /// The value of [action_type][crate::model::UniversalActionExtensionPoint::action_type]
    /// if it holds a `OpenLink`, `None` if the field is not set or
    /// holds a different branch.
    pub fn open_link(&self) -> std::option::Option<&std::string::String> {
        #[allow(unreachable_patterns)]
        self.action_type.as_ref().and_then(|v| match v {
            crate::model::universal_action_extension_point::ActionType::OpenLink(v) => {
                std::option::Option::Some(v)
            }
            _ => std::option::Option::None,
        })
    }

    /// Sets the value of [action_type][crate::model::UniversalActionExtensionPoint::action_type]
    /// to hold a `OpenLink`.
    ///
    /// Note that all the setters affecting `action_type` are
    /// mutually exclusive.
    pub fn set_open_link<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.action_type = std::option::Option::Some(
            crate::model::universal_action_extension_point::ActionType::OpenLink(v.into()),
        );
        self
    }

    /// The value of [action_type][crate::model::UniversalActionExtensionPoint::action_type]
    /// if it holds a `RunFunction`, `None` if the field is not set or
    /// holds a different branch.
    pub fn run_function(&self) -> std::option::Option<&std::string::String> {
        #[allow(unreachable_patterns)]
        self.action_type.as_ref().and_then(|v| match v {
            crate::model::universal_action_extension_point::ActionType::RunFunction(v) => {
                std::option::Option::Some(v)
            }
            _ => std::option::Option::None,
        })
    }

    /// Sets the value of [action_type][crate::model::UniversalActionExtensionPoint::action_type]
    /// to hold a `RunFunction`.
    ///
    /// Note that all the setters affecting `action_type` are
    /// mutually exclusive.
    pub fn set_run_function<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.action_type = std::option::Option::Some(
            crate::model::universal_action_extension_point::ActionType::RunFunction(v.into()),
        );
        self
    }
}

impl wkt::message::Message for UniversalActionExtensionPoint {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.UniversalActionExtensionPoint"
    }
}

/// Defines additional types related to [UniversalActionExtensionPoint].
pub mod universal_action_extension_point {
    #[allow(unused_imports)]
    use super::*;

    /// Required. The action type supported on a universal action menu item. It
    /// could be either a link to open or an endpoint to execute.
    #[derive(Clone, Debug, PartialEq)]
    #[non_exhaustive]
    pub enum ActionType {
        /// URL to be opened by the UniversalAction.
        OpenLink(std::string::String),
        /// Endpoint to be run by the UniversalAction.
        RunFunction(std::string::String),
    }
}

/// Add-on configuration that is shared across all add-on host applications.
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct CommonAddOnManifest {
    /// Required. The display name of the add-on.
    pub name: std::string::String,

    /// Required. The URL for the logo image shown in the add-on toolbar.
    pub logo_url: std::string::String,

    /// Common layout properties for the add-on cards.
    pub layout_properties: std::option::Option<crate::model::LayoutProperties>,

    /// The widgets used in the add-on. If this field is not specified,
    /// it indicates that default set is used.
    pub add_on_widget_set: std::option::Option<crate::model::AddOnWidgetSet>,

    /// Whether to pass locale information from host app.
    pub use_locale_from_app: bool,

    /// Defines an endpoint that will be executed in any context, in
    /// any host. Any cards generated by this function will always be available to
    /// the user, but may be eclipsed by contextual content when this add-on
    /// declares more targeted triggers.
    pub homepage_trigger: std::option::Option<crate::model::HomepageExtensionPoint>,

    /// Defines a list of extension points in the universal action menu which
    /// serves as a setting menu for the add-on. The extension point can be
    /// link URL to open or an endpoint to execute as a form
    /// submission.
    pub universal_actions: std::vec::Vec<crate::model::UniversalActionExtensionPoint>,

    /// An OpenLink action
    /// can only use a URL with an HTTPS, MAILTO or TEL scheme.  For HTTPS links,
    /// the URL must also
    /// [match](/gmail/add-ons/concepts/manifests#whitelisting_urls) one of the
    /// prefixes specified in this whitelist. If the prefix omits the scheme, HTTPS
    /// is assumed.  Notice that HTTP links are automatically rewritten to HTTPS
    /// links.
    pub open_link_url_prefixes: std::option::Option<wkt::ListValue>,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl CommonAddOnManifest {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [name][crate::model::CommonAddOnManifest::name].
    pub fn set_name<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.name = v.into();
        self
    }

    /// Sets the value of [logo_url][crate::model::CommonAddOnManifest::logo_url].
    pub fn set_logo_url<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.logo_url = v.into();
        self
    }

    /// Sets the value of [layout_properties][crate::model::CommonAddOnManifest::layout_properties].
    pub fn set_layout_properties<T>(mut self, v: T) -> Self
    where
        T: std::convert::Into<crate::model::LayoutProperties>,
    {
        self.layout_properties = std::option::Option::Some(v.into());
        self
    }

    /// Sets or clears the value of [layout_properties][crate::model::CommonAddOnManifest::layout_properties].
    pub fn set_or_clear_layout_properties<T>(mut self, v: std::option::Option<T>) -> Self
    where
        T: std::convert::Into<crate::model::LayoutProperties>,
    {
        self.layout_properties = v.map(|x| x.into());
        self
    }

    /// Sets the value of [add_on_widget_set][crate::model::CommonAddOnManifest::add_on_widget_set].
    pub fn set_add_on_widget_set<T>(mut self, v: T) -> Self
    where
        T: std::convert::Into<crate::model::AddOnWidgetSet>,
    {
        self.add_on_widget_set = std::option::Option::Some(v.into());
        self
    }

    /// Sets or clears the value of [add_on_widget_set][crate::model::CommonAddOnManifest::add_on_widget_set].
    pub fn set_or_clear_add_on_widget_set<T>(mut self, v: std::option::Option<T>) -> Self
    where
        T: std::convert::Into<crate::model::AddOnWidgetSet>,
    {
        self.add_on_widget_set = v.map(|x| x.into());
        self
    }

    /// Sets the value of [use_locale_from_app][crate::model::CommonAddOnManifest::use_locale_from_app].
    pub fn set_use_locale_from_app<T: std::convert::Into<bool>>(mut self, v: T) -> Self {
        self.use_locale_from_app = v.into();
        self
    }

    /// Sets the value of [homepage_trigger][crate::model::CommonAddOnManifest::homepage_trigger].
    pub fn set_homepage_trigger<T>(mut self, v: T) -> Self
    where
        T: std::convert::Into<crate::model::HomepageExtensionPoint>,
    {
        self.homepage_trigger = std::option::Option::Some(v.into());
        self
    }

    /// Sets or clears the value of [homepage_trigger][crate::model::CommonAddOnManifest::homepage_trigger].
    pub fn set_or_clear_homepage_trigger<T>(mut self, v: std::option::Option<T>) -> Self
    where
        T: std::convert::Into<crate::model::HomepageExtensionPoint>,
    {
        self.homepage_trigger = v.map(|x| x.into());
        self
    }

    /// Sets the value of [universal_actions][crate::model::CommonAddOnManifest::universal_actions].
    pub fn set_universal_actions<T, V>(mut self, v: T) -> Self
    where
        T: std::iter::IntoIterator<Item = V>,
        V: std::convert::Into<crate::model::UniversalActionExtensionPoint>,
    {
        use std::iter::Iterator;
        self.universal_actions = v.into_iter().map(|i| i.into()).collect();
        self
    }

    /// Sets the value of [open_link_url_prefixes][crate::model::CommonAddOnManifest::open_link_url_prefixes].
    pub fn set_open_link_url_prefixes<T>(mut self, v: T) -> Self
    where
        T: std::convert::Into<wkt::ListValue>,
    {
        self.open_link_url_prefixes = std::option::Option::Some(v.into());
        self
    }

    /// Sets or clears the value of [open_link_url_prefixes][crate::model::CommonAddOnManifest::open_link_url_prefixes].
    pub fn set_or_clear_open_link_url_prefixes<T>(mut self, v: std::option::Option<T>) -> Self
    where
        T: std::convert::Into<wkt::ListValue>,
    {
        self.open_link_url_prefixes = v.map(|x| x.into());
        self
    }
}

impl wkt::message::Message for CommonAddOnManifest {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.CommonAddOnManifest"
    }
}

/// Card layout properties shared across all add-on host applications.
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct LayoutProperties {
    /// The primary color of the add-on. It sets the color of toolbar. If no
    /// primary color is set explicitly, the default value provided by the
    /// framework is used.
    pub primary_color: std::string::String,

    /// The secondary color of the add-on. It sets the color of buttons.
    /// If primary color is set but no secondary color is set, the
    /// secondary color is the same as the primary color. If neither primary
    /// color nor secondary color is set, the default value provided by the
    /// framework is used.
    pub secondary_color: std::string::String,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl LayoutProperties {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [primary_color][crate::model::LayoutProperties::primary_color].
    pub fn set_primary_color<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.primary_color = v.into();
        self
    }

    /// Sets the value of [secondary_color][crate::model::LayoutProperties::secondary_color].
    pub fn set_secondary_color<T: std::convert::Into<std::string::String>>(mut self, v: T) -> Self {
        self.secondary_color = v.into();
        self
    }
}

impl wkt::message::Message for LayoutProperties {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.LayoutProperties"
    }
}

/// Options for sending requests to add-on HTTP endpoints
#[derive(Clone, Default, PartialEq)]
#[non_exhaustive]
pub struct HttpOptions {
    /// Configuration for the token sent in the HTTP Authorization header
    pub authorization_header: crate::model::HttpAuthorizationHeader,

    pub(crate) _unknown_fields: serde_json::Map<std::string::String, serde_json::Value>,
}

impl HttpOptions {
    pub fn new() -> Self {
        std::default::Default::default()
    }

    /// Sets the value of [authorization_header][crate::model::HttpOptions::authorization_header].
    pub fn set_authorization_header<
        T: std::convert::Into<crate::model::HttpAuthorizationHeader>,
    >(
        mut self,
        v: T,
    ) -> Self {
        self.authorization_header = v.into();
        self
    }
}

impl wkt::message::Message for HttpOptions {
    fn typename() -> &'static str {
        "type.googleapis.com/google.apps.script.type.HttpOptions"
    }
}

/// Authorization header sent in add-on HTTP requests
///
/// # Working with unknown values
///
/// This enum is defined as `#[non_exhaustive]` because Google Cloud may add
/// additional enum variants at any time. Adding new variants is not considered
/// a breaking change. Applications should write their code in anticipation of:
///
/// - New values appearing in future releases of the client library, **and**
/// - New values received dynamically, without application changes.
///
/// Please consult the [Working with enums] section in the user guide for some
/// guidelines.
///
/// [Working with enums]: https://google-cloud-rust.github.io/working_with_enums.html
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum HttpAuthorizationHeader {
    /// Default value, equivalent to `SYSTEM_ID_TOKEN`
    Unspecified,
    /// Send an ID token for the project-specific Google Workspace add-ons system
    /// service account (default)
    SystemIdToken,
    /// Send an ID token for the end user
    UserIdToken,
    /// Do not send an Authentication header
    None,
    /// If set, the enum was initialized with an unknown value.
    ///
    /// Applications can examine the value using [HttpAuthorizationHeader::value] or
    /// [HttpAuthorizationHeader::name].
    UnknownValue(http_authorization_header::UnknownValue),
}

#[doc(hidden)]
pub mod http_authorization_header {
    #[allow(unused_imports)]
    use super::*;
    #[derive(Clone, Debug, PartialEq)]
    pub struct UnknownValue(pub(crate) wkt::internal::UnknownEnumValue);
}

impl HttpAuthorizationHeader {
    /// Gets the enum value.
    ///
    /// Returns `None` if the enum contains an unknown value deserialized from
    /// the string representation of enums.
    pub fn value(&self) -> std::option::Option<i32> {
        match self {
            Self::Unspecified => std::option::Option::Some(0),
            Self::SystemIdToken => std::option::Option::Some(1),
            Self::UserIdToken => std::option::Option::Some(2),
            Self::None => std::option::Option::Some(3),
            Self::UnknownValue(u) => u.0.value(),
        }
    }

    /// Gets the enum value as a string.
    ///
    /// Returns `None` if the enum contains an unknown value deserialized from
    /// the integer representation of enums.
    pub fn name(&self) -> std::option::Option<&str> {
        match self {
            Self::Unspecified => std::option::Option::Some("HTTP_AUTHORIZATION_HEADER_UNSPECIFIED"),
            Self::SystemIdToken => std::option::Option::Some("SYSTEM_ID_TOKEN"),
            Self::UserIdToken => std::option::Option::Some("USER_ID_TOKEN"),
            Self::None => std::option::Option::Some("NONE"),
            Self::UnknownValue(u) => u.0.name(),
        }
    }
}

impl std::default::Default for HttpAuthorizationHeader {
    fn default() -> Self {
        use std::convert::From;
        Self::from(0)
    }
}

impl std::fmt::Display for HttpAuthorizationHeader {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
        wkt::internal::display_enum(f, self.name(), self.value())
    }
}

impl std::convert::From<i32> for HttpAuthorizationHeader {
    fn from(value: i32) -> Self {
        match value {
            0 => Self::Unspecified,
            1 => Self::SystemIdToken,
            2 => Self::UserIdToken,
            3 => Self::None,
            _ => Self::UnknownValue(http_authorization_header::UnknownValue(
                wkt::internal::UnknownEnumValue::Integer(value),
            )),
        }
    }
}

impl std::convert::From<&str> for HttpAuthorizationHeader {
    fn from(value: &str) -> Self {
        use std::string::ToString;
        match value {
            "HTTP_AUTHORIZATION_HEADER_UNSPECIFIED" => Self::Unspecified,
            "SYSTEM_ID_TOKEN" => Self::SystemIdToken,
            "USER_ID_TOKEN" => Self::UserIdToken,
            "NONE" => Self::None,
            _ => Self::UnknownValue(http_authorization_header::UnknownValue(
                wkt::internal::UnknownEnumValue::String(value.to_string()),
            )),
        }
    }
}

impl serde::ser::Serialize for HttpAuthorizationHeader {
    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        match self {
            Self::Unspecified => serializer.serialize_i32(0),
            Self::SystemIdToken => serializer.serialize_i32(1),
            Self::UserIdToken => serializer.serialize_i32(2),
            Self::None => serializer.serialize_i32(3),
            Self::UnknownValue(u) => u.0.serialize(serializer),
        }
    }
}

impl<'de> serde::de::Deserialize<'de> for HttpAuthorizationHeader {
    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        deserializer.deserialize_any(wkt::internal::EnumVisitor::<HttpAuthorizationHeader>::new(
            ".google.apps.script.type.HttpAuthorizationHeader",
        ))
    }
}
